Need a little more serialisation in pciback_do_op().
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 25 Apr 2006 17:22:11 +0000 (18:22 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 25 Apr 2006 17:22:11 +0000 (18:22 +0100)
Signed-off-by: Keir Fraser <keir@xensource.com>
linux-2.6-xen-sparse/drivers/xen/pciback/pciback_ops.c

index 4dc35d581ceb0f096ffc3c1fb41b86d85816147c..96715899cb987c81ea03072cc2cf62028713c383 100644 (file)
@@ -77,12 +77,13 @@ void pciback_do_op(void *data)
        clear_bit(_XEN_PCIF_active, (unsigned long *)&pdev->sh_info->flags);
        notify_remote_via_irq(pdev->evtchn_irq);
 
-       /* Mark that we're done */
-       wmb();
+       /* Mark that we're done. */
+       smp_mb__before_clear_bit(); /* /after/ clearing PCIF_active */
        clear_bit(_PDEVF_op_active, &pdev->flags);
+       smp_mb__after_clear_bit(); /* /before/ final check for work */
 
-       /* Check to see if the driver domain tried to start another request
-        * in between clearing _XEN_PCIF_active and clearing _PDEVF_op_active */
+       /* Check to see if the driver domain tried to start another request in
+        * between clearing _XEN_PCIF_active and clearing _PDEVF_op_active. */
        test_and_schedule_op(pdev);
 }